/*
 * @Description: 
 * @Author: chaixinyu
 * @Date: 2022-10-28 14:49:53
 * @LastEditors: 47
 * @LastEditTime: 2023-01-11 19:45:05
 */
const express = require('express')
const app = express()
const cors = require('cors')
const port = 3000

// 导入路由模块
const demoRouter = require('./routes/demo')
//导入课程路由模块
const courseRouter = require('./routes/course')
// 解析 post 表单数据的中间件
const { expressjwt } = require('express-jwt')

// const port = 3001

// 导入路由模块
const loginRouter = require('./routes/login')
const adminRouter = require('./routes/admin')
// 导入并注册群聊路由模块
const chatRouter = require('./routes/chat')
// 导入并注册 通讯录模块
const userRouter = require('./routes/user')
// 导入并注册笔记模块
const noteRouter = require('./routes/note')
//处理请求体中的设置json数据格式
app.use(express.json())
app.use(express.urlencoded())

//注册cors模块
app.use(cors())

// 注册路由
app.use('/api/demo', demoRouter)
app.use('/api/course', courseRouter)


// ----闫一丹----------------------------------------------
/**
 * 优化 res.send() 代码
 * 在处理函数中，需要多次调用 res.send() 向客户端响应 处理失败 的结果，
 * 可以手动封装一个 res.cc() 函数
 * 一定在所有路由之前，声明一个全局中间件，为 res 对象挂载一个 res.cc() 函数
 */
app.use((req, res, next) => {
    // status 默认值为 1 表示失败的情况
    // err 的值,可能是一个错误对象,也可能是一个错误的描述字符串
    res.cc = function (err, status = 1) {
        res.send({
            status,
            message: err instanceof Error ? err.message : err,
        })
    }
    next()
})


// app.listen(port, () => {
//     console.log(`端口${port}监听成功`);
// })

// 服务器端请求拦截器
// 注意：中间件一定要配置在路由前面！
// 注意：只要配置成功了 express-jwt 这个中间件，就可以把解析出来的用户信息，挂载到 `req.auth` 属性上
app.use(expressjwt({
    algorithms: ['HS256'],//加密算法，默认是HS256
    secret: '159951',//先前为了生成token设置的密钥
}).unless({//指定不拦截的路由，我这里是登录路由不验证是否有token,其余token及为没有权限的Token
    path: [/^\/api\//]
}))

// 如果express-jwt解析token出错，中间件会抛出UnauthorizedError错误
app.use((err, req, res, next) => {
    // 当token验证失败时会抛出如下错误
    console.log(err);
    if (err.name === 'UnauthorizedError') {
        // console.log('无效token');
        res.status(401).send({
            status: 'fail',
            message: '身份校验过期，请重新登录'
        })
    }
})
app.use((req, res, next) => {
    //  status 默认值为 1 表示失败的情况
    // err 的值,可能是一个错误对象,也可能是一个错误的描述字符串
    res.cc = function (err, status = 1) {
        res.send({
            status,
            message: err instanceof Error ? err.message : err,
        })
    }
    next()
})

// 使用路由
app.use('/api', loginRouter)
app.use('/admin', adminRouter)
app.use('/my', chatRouter)
app.use('/friend', userRouter)
app.use('/note', noteRouter)


// app.listen(port, () => {
//     console.log(`端口${port}监听成功`);
// })
app.listen(3010, function () {
    console.log('api server running at http://127.0.0.1:3010')
})
